home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 1 / PC Actual CD 01.iso / f1 / cimb.arj / GIFASM.ASM < prev    next >
Encoding:
Assembly Source File  |  1994-08-30  |  8.1 KB  |  554 lines

  1. ;===============================================================================
  2. ;
  3. ;FICHERO: GIFASM.ASM
  4. ;
  5. ;AUTOR: ANTONIO LADESA JURADO
  6. ;
  7. ;FECHA: 24/6/94
  8. ;
  9. ;DESCRIPCION:
  10. ;
  11. ;    Fichero que contiene las constantes, variables y funciones
  12. ;    para la compresión LZW de ficheros GIF.
  13. ;
  14. ; Extraido del libro Bit-Mapped Graphics y modificado para posibilitar
  15. ; la grabación de una imagen de más de 64k.
  16. ; Para ello, se lee la imagen desde disco.
  17. ;
  18. ;
  19. ;===============================================================================
  20.  
  21.  
  22. BUFFERSIZE    EQU    255
  23. MAXMAX        EQU    4096    ;CODIGO MAXIMO + 1
  24.  
  25. STRUCTSIZE    EQU    32
  26. HASHFIRST    EQU    0    ;DESPLAZAMIENTOS EN LA TABLA DE MASCARAS
  27. HASHNEXT    EQU    2
  28. HASHCHAR    EQU    4
  29. _AOFF        EQU    6
  30.  
  31. ;SEGMENTO DE DATOS
  32. SEGDATOS        MACRO
  33.         PUSH AX
  34.         MOV AX,_DATA                                     
  35.         MOV DS,AX
  36.         POP AX
  37.         ENDM
  38.  
  39. ;SEGMENTO EXTRA
  40. EXTRASEG    MACRO
  41.         PUSH AX
  42.         MOV AX,_DATA
  43.         MOV ES,AX
  44.         POP AX
  45.         ENDM
  46.  
  47. GIFENC_TEXT    SEGMENT BYTE PUBLIC 'CODE'
  48.         ASSUME CS:GIFENC_TEXT,DS:_DATA
  49.  
  50. ;----- FUNCION: int LZWescribir(GIFdatos *gd) ----------------------------------
  51. ;
  52. ; Descripción:
  53. ;
  54. ;    Esta función comprime y graba en disco una imagen cuyos datos aparecen en la
  55. ; estructura gd.
  56. ;
  57. ; Parámetros:
  58. ;
  59. ;        GIFdatos *gd : puntero a estructura que contiene los datos de la imagen
  60. ;
  61. ;    Retorno:
  62. ;
  63. ;        1:error creacion de fichero
  64. ;        2:error escritura cabecera
  65. ;        3:error datos
  66. ;        4:error cierre fichero
  67. ;
  68. ;-------------------------------------------------------------------------------
  69.  
  70.         PUBLIC _LZWescribir
  71. _LZWescribir PROC FAR
  72.         PUSH BP
  73.         MOV BP,SP
  74.  
  75.         MOV DI,OFFSET STARTINIT
  76.         MOV AX,_DATA
  77.         MOV ES,AX
  78.         MOV CX,ENDINIT-STARTINIT
  79.         CLD
  80.         MOV AL,0
  81.         REPNE STOSB
  82.  
  83.         MOV SI,[BP+_AOFF+0]
  84.         MOV DS,[BP+_AOFF+2]
  85.         EXTRASEG
  86.         MOV DI,OFFSET GIFSTRUCT
  87.         MOV CX,STRUCTSIZE
  88.         CLD
  89.         REPNE MOVSB
  90.  
  91.         SEGDATOS
  92.  
  93.         MOV CX,BITS
  94.         MOV AX,1
  95.         SHL AX,CL
  96.  
  97.         MOV CLEAR,AX
  98.         INC AX
  99.         MOV EOI,AX
  100.         INC AX
  101.         MOV FIRSTFREE,AX
  102.  
  103.         CALL FOPEN
  104.         CALL FCREATE
  105.         JNC PACK1
  106.         MOV AX,0001H
  107.         JMP PACKX
  108.  
  109. PACK1:        CALL HEADER
  110.         JNC PACK2
  111.         CALL FCLOSE
  112.         MOV AX,0002H
  113.         JMP PACKX
  114.  
  115. PACK2:        CALL COMPRESS
  116.         CALL FOOTER
  117.         JNC PACK3
  118.         CALL FCLOSE
  119.         MOV AX,0003H
  120.         JMP PACKX
  121.  
  122. PACK3:        CALL FCLOSE
  123.         JNC PACK4
  124.         MOV AX,0004H
  125.         JMP PACKX
  126.  
  127. PACK4:        MOV AX,0
  128.  
  129. PACKX:        POP BP
  130.         RET
  131.  
  132. _LZWescribir ENDP
  133.  
  134.  
  135. ; ESCRIBIR LA CABECERA
  136. HEADER        PROC NEAR
  137.         MOV DX,OFFSET GIFHEAD
  138.         MOV CX,6
  139.         CALL FWRITE
  140.         MOV AX,SCREENWIDE
  141.         CALL FPUTW
  142.         MOV AX,SCREENDEEP
  143.         CALL FPUTW
  144.         MOV AX,BITS
  145.         DEC AX
  146.         OR AL,90H
  147.         CALL FPUTC
  148.         MOV AX,BACKGROUND
  149.         CALL FPUTC
  150.         MOV AL,00H
  151.         CALL FPUTC
  152.  
  153.         MOV AX,1
  154.         MOV CX,BITS
  155.         SHL AX,CL
  156.         MOV CX,3
  157.         MUL CX
  158.  
  159.         MOV CX,AX
  160.         MOV DX,PALETTEOFF
  161.         PUSH DS
  162.         MOV DS,PALETTESEG
  163.         CALL FWRITE
  164.         POP DS
  165.         MOV AL,','
  166.         CALL FPUTC
  167.         MOV AX,IMAGELEFT
  168.         CALL FPUTW
  169.         MOV AX,IMAGETOP
  170.         CALL FPUTW
  171.         MOV AX,IMAGEWIDE
  172.         CALL FPUTW
  173.         MOV AX,IMAGEDEEP
  174.         CALL FPUTW
  175.  
  176.         MOV AX,BITS
  177.         DEC AX
  178.         CALL FPUTC
  179.  
  180.         MOV AX,BITS
  181.         CALL FPUTC
  182.         RET
  183. HEADER        ENDP
  184.  
  185. FOOTER        PROC NEAR
  186.         MOV AL,0
  187.         CALL FPUTC
  188.         MOV AL,3BH
  189.         CALL FPUTC
  190.         RET
  191. FOOTER        ENDP
  192.  
  193.  
  194. ; COMPRIME LA IMAGEN
  195. COMPRESS    PROC NEAR
  196.         CALL INIT_TABLE
  197.         MOV AX,CLEAR
  198.         CALL WRITE_CODE
  199.         CALL FGETCH
  200. L4:        XOR AH,AH
  201. L4A:        MOV PREFIXCODE,AX
  202.         CALL FGETCH
  203.         JC L17
  204.         MOV THISBYTE,AL
  205.         MOV BX,PREFIXCODE
  206.         CALL LOOKUP_CODE
  207.         JNC L4A
  208.         CALL ADD_CODE
  209.         PUSH BX
  210.         MOV AX,PREFIXCODE
  211.         CALL WRITE_CODE
  212.         POP BX
  213.         MOV AL,THISBYTE
  214.         CMP BX,MAXCODE
  215.         JL L4
  216.         CMP NBITS,12
  217.         JL L14
  218.         MOV AX,CLEAR
  219.         CALL WRITE_CODE
  220.         CALL INIT_TABLE
  221.         MOV AL,THISBYTE
  222.         JMP L4
  223.  
  224. L14:        INC NBITS
  225.         SHL MAXCODE,1
  226.         JMP L4
  227.  
  228. L17:        MOV AX,PREFIXCODE
  229.         CALL WRITE_CODE
  230.         MOV AX,EOI
  231.         CALL WRITE_CODE
  232.         MOV AX,BITOFFSET
  233.         CMP AX,0
  234.         JE L18
  235.         MOV CX,8
  236.         XOR DX,DX
  237.         DIV CX
  238.         OR DX,DX
  239.         JE L17A
  240.         INC AX
  241.  
  242. L17A:        CALL FLUSH
  243. L18:        RET
  244. COMPRESS    ENDP
  245.  
  246.  
  247. ; INICIALIZAR LA TABLA
  248.  
  249. INIT_TABLE    PROC NEAR
  250.         MOV AX,BITS
  251.         INC AX
  252.         MOV NBITS,AX
  253.  
  254.         MOV AX,CLEAR
  255.         SHL AX,1
  256.         MOV MAXCODE,AX
  257.  
  258.         MOV AX,CLEAR
  259.         PUSH ES
  260.         EXTRASEG
  261.         MOV CX,5
  262.         MUL CX
  263.         MOV CX,AX
  264.         MOV AX,-1
  265.         MOV DI,OFFSET HASH
  266.         REP STOSW
  267.         POP ES
  268.         MOV AX,FIRSTFREE
  269.         MOV FREECODE,AX
  270.         RET
  271. INIT_TABLE    ENDP
  272.  
  273.  
  274. ; ESCRIBIR UN CODIGO
  275. WRITE_CODE    PROC NEAR
  276.         PUSH AX
  277.         MOV AX,BITOFFSET
  278.         MOV CX,NBITS
  279.         ADD BITOFFSET,CX
  280.         MOV CX,8
  281.         XOR DX,DX
  282.         DIV CX
  283.         CMP AX,BUFFERSIZE-4
  284.         JL WC1
  285.         CALL FLUSH
  286.         PUSH DX
  287.         ADD DX,NBITS
  288.         MOV BITOFFSET,DX
  289.         POP DX
  290.         ADD AX,OFFSET OUTPUTDATA
  291.         MOV SI,AX
  292.         MOV AL,BYTE PTR [SI]
  293.         MOV OUTPUTDATA,AL
  294.         XOR AX,AX
  295. WC1:        ADD AX,OFFSET OUTPUTDATA
  296.         MOV DI,AX
  297.         POP AX
  298.         MOV CX,DX
  299.         XOR DX,DX
  300.         JCXZ WC3
  301. WC2:        SHL AX,1
  302.         RCL DX,1
  303.         LOOP WC2
  304.         OR AL,BYTE PTR [DI]
  305. WC3:        PUSH ES
  306.         EXTRASEG
  307.         STOSW
  308.         MOV AL,DL
  309.         STOSB
  310.         POP ES
  311.         RET
  312. WRITE_CODE    ENDP
  313.  
  314.  
  315. FLUSH        PROC NEAR
  316.         PUSH AX
  317.         PUSH BX
  318.         PUSH CX
  319.         PUSH DX
  320.         MOV ONEBYTE,AL
  321.  
  322.         MOV BX,HANDLE
  323.         MOV DX, OFFSET ONEBYTE
  324.         MOV CX,AX
  325.         INC CX
  326.         MOV AX,4000H
  327.         INT 21H
  328.  
  329.         POP DX
  330.         POP CX
  331.         POP BX
  332.         POP AX
  333.         RET
  334. FLUSH        ENDP
  335.  
  336. ; LEER UN BYTE DEL BLOQUE DE DATOS
  337. FGETCH        PROC NEAR
  338.         CMP SIZEMSB,0
  339.         JNE FGETCH0
  340.         CMP SIZELSB,0
  341.         JNE FGETCH0
  342.  
  343.         STC
  344.         RET
  345.  
  346. FGETCH0:    PUSH BX
  347.                     PUSH CX
  348.                     PUSH DX
  349.                     MOV AX,3F00H
  350.                     MOV BX,ORIGEN
  351.                     MOV CX,1
  352.                     MOV DX, OFFSET LEIDO
  353.                     INT 21H
  354.                     MOV AL,DS:LEIDO
  355.                     POP DX
  356.                     POP CX
  357.                     POP BX
  358.                     
  359. FGETCH1:    CMP SIZELSB,0
  360.         JE FGETCH2
  361.         DEC SIZELSB
  362.         JMP FGETCH3
  363.  
  364. FGETCH2:    DEC SIZEMSB
  365.         DEC SIZELSB
  366.  
  367.  
  368. FGETCH3:    CLC
  369.         RET
  370. FGETCH        ENDP
  371.  
  372.  
  373. ; ENCONTRAR UN CODIGO EN LA TABLA
  374. LOOKUP_CODE    PROC NEAR
  375.         CALL INDEX
  376.         MOV DI,0
  377.         CMP BYTE PTR [SI+HASHFIRST],-1
  378.         JE GC4
  379.         INC DI
  380.         MOV BX,[SI+HASHFIRST]
  381. GC2:        CALL INDEX
  382.         CMP [SI+HASHCHAR],AL
  383.         JNE GC3
  384.         CLC
  385.         MOV AX,BX
  386.         RET
  387. GC3:        CMP WORD PTR [SI+HASHNEXT],-1
  388.         JE GC4
  389.         MOV BX,[SI+HASHNEXT]
  390.         JMP GC2
  391. GC4:        STC
  392.         RET
  393. LOOKUP_CODE    ENDP
  394.  
  395.  
  396. ; CONVERTIR INDICE EN DIRECCION
  397. INDEX        PROC NEAR
  398.         MOV SI,BX
  399.         SHL SI,1
  400.         SHL SI,1
  401.         ADD SI,BX
  402.         ADD SI,OFFSET HASH
  403.         RET
  404. INDEX        ENDP
  405.  
  406.  
  407. ;INSERTAR CODIGO EN LA TABLA
  408. ADD_CODE    PROC NEAR
  409.         MOV BX,FREECODE
  410.         CMP DI,0
  411.         JE AC1
  412.         MOV [SI+HASHNEXT],BX
  413.         JMP AC2
  414. AC1:        MOV [SI+HASHFIRST],BX
  415. AC2:        CMP BX,MAXMAX
  416.         JE AC3
  417.         CALL INDEX
  418.         MOV WORD PTR [SI+HASHFIRST],-1
  419.         MOV WORD PTR [SI+HASHNEXT],-1
  420.         MOV [SI+HASHCHAR],AL
  421.         INC FREECODE
  422. AC3:        RET
  423. ADD_CODE    ENDP
  424.  
  425.  
  426. ; CREAR FICHERO GIF VACIO
  427. FCREATE        PROC NEAR
  428.         PUSH DS
  429.         MOV DX,DESTINOOFF
  430.         MOV DS,DESTINOSEG
  431.  
  432.         MOV AX,3C00H
  433.         MOV CX,0000H
  434.         INT 21H
  435.         POP DS
  436.         MOV HANDLE,AX
  437.         RET
  438. FCREATE        ENDP
  439.  
  440.  
  441. ; CREAR FICHERO GIF VACIO
  442. FOPEN        PROC NEAR
  443.         PUSH DS
  444.         PUSH DX
  445.         MOV DX,ORIGENOFF
  446.         MOV DS,ORIGENSEG
  447.  
  448.         MOV AX,3D00H
  449.         INT 21H
  450.         POP DX
  451.         POP DS
  452.         MOV ORIGEN,AX
  453.         RET
  454. FOPEN        ENDP
  455.  
  456.  
  457. ;ESCRIBIR CX BYTES EN EL FICHERO
  458. FWRITE        PROC NEAR
  459.         PUSH DS
  460.         SEGDATOS
  461.         MOV BX,HANDLE
  462.         POP DS
  463.         MOV AX,4000H
  464.         INT 21H
  465.         RET
  466. FWRITE        ENDP
  467.  
  468.  
  469. ;ESCRIBIR EL BYTE DE AL EN EL FICHERO
  470. FPUTC        PROC NEAR
  471.         MOV ONEBYTE,AL
  472.         MOV AX,4000H
  473.         MOV BX,HANDLE
  474.         MOV CX,0001H
  475.         MOV DX,OFFSET ONEBYTE
  476.         INT 21H
  477.         RET
  478. FPUTC        ENDP
  479.  
  480.  
  481. ;ESCRIBIR LA PALABRA DE AX EN EL FICHERO
  482. FPUTW        PROC NEAR
  483.         PUSH AX
  484.         CALL FPUTC
  485.         POP AX
  486.         MOV AL,AH
  487.         CALL FPUTC
  488.         RET
  489. FPUTW        ENDP
  490.  
  491.  
  492. ;CERRAR LOS FICHEROS
  493. FCLOSE        PROC NEAR
  494.         MOV AX,3E00H
  495.         MOV BX,HANDLE
  496.         INT 21H
  497.  
  498.         MOV AX,3E00H
  499.         MOV BX,ORIGEN
  500.         INT 21H
  501.  
  502.         RET
  503. FCLOSE        ENDP
  504.  
  505. GIFENC_TEXT    ENDS
  506.  
  507. DGROUP        GROUP _DATA,_BSS
  508. _DATA        SEGMENT WORD PUBLIC 'DATA'
  509.  
  510. GIFHEAD        DB    'GIF87a'
  511.  
  512. STARTINIT    LABEL    BYTE
  513. GIFSTRUCT    LABEL    BYTE
  514. SCREENWIDE    DW    ?
  515. SCREENDEEP    DW    ?
  516. IMAGELEFT     DW    ?
  517. IMAGETOP      DW    ?
  518. IMAGEWIDE     DW    ?
  519. IMAGEDEEP     DW    ?
  520. BACKGROUND    DW    ?
  521. BITS          DW    ?
  522. SIZELSB       DW    ?
  523. SIZEMSB       DW    ?
  524. PALETTEOFF    DW    ?
  525. PALETTESEG    DW    ?
  526. ORIGENOFF      DW    ?
  527. ORIGENSEG      DW    ?
  528. DESTINOOFF    DW    ?
  529. DESTINOSEG     DW    ?
  530.  
  531. CLEAR         DW    0
  532. EOI           DW    0
  533. FIRSTFREE     DW    0
  534. PREFIXCODE    DW    0
  535. FREECODE      DW    0
  536. MAXCODE       DW    0
  537. NBITS         DW    0
  538. THISBYTE      DB    0
  539. BITOFFSET     DW    0
  540. HANDLE        DW    0
  541. ORIGEN            DW    0
  542. LEIDO                DB  0
  543. ONEBYTE       DB    0
  544. OUTPUTDATA    DB    BUFFERSIZE DUP (0)
  545.  
  546. HASH          DB    20480 DUP (0)
  547. ENDINIT       LABEL    BYTE
  548.  
  549. _DATA        ENDS
  550.  
  551. _BSS        SEGMENT WORD PUBLIC 'BSS'
  552. _BSS        ENDS
  553.         END
  554.